地理空間データ分析(共立出版) の 付録BとDを参考に,sp
クラスデータの作成と操作についてまとめる.
Rで空間データを扱うための基盤となるsp
パッケージで用いられるGISデータのクラス.
地点データのSpatialPoints
, 線分データのSpatialLines
, ポリゴンデータのSpatialPolygons
など.
地点データを扱うクラスであり,地点の座標,境界を表すbbox
,投影?座標系情報のproj4string
からなる.SpatialPoints
に属性のデータフレームを追加したのがSpatialPointsDataFRame
クラス.
library(sp)
lon <- c(135.7917,135.8167,135.8528,135.7639,135.8639,135.8056,135.8667,135.8583,135.8639,135.9361,135.7833)
lat <- c(35.11111,35.14722,35.10833,35.10000,35.11944,35.02500,35.06667,35.10278,34.95556,35.02500,35.00000)
lonlat <- cbind(lon,lat) # 地点データ
pj <- CRS("+proj=longlat +datum=WGS84") # 投影?座標系情報
sp <- SpatialPoints(lonlat, proj4string=pj) # SpatialPointsの作成
d <- data.frame(id=as.factor(1:length(sp))) # 属性データ
spd <- SpatialPointsDataFrame(sp,data=d) # SpatialPointsDataFrameの作成
spd@coords # 地点データ
## lon lat
## [1,] 135.8 35.11
## [2,] 135.8 35.15
## [3,] 135.9 35.11
## [4,] 135.8 35.10
## [5,] 135.9 35.12
## [6,] 135.8 35.02
## [7,] 135.9 35.07
## [8,] 135.9 35.10
## [9,] 135.9 34.96
## [10,] 135.9 35.02
## [11,] 135.8 35.00
spd@bbox # 境界
## min max
## lon 135.76 135.94
## lat 34.96 35.15
spd@proj4string # 投影?座標系情報
## CRS arguments: +proj=longlat +datum=WGS84
spd@data # 属性データ
## id
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5
## 6 6
## 7 7
## 8 8
## 9 9
## 10 10
## 11 11
spplot(spd,key.space="right")
線分を定義するLine
クラスであり,Line()
で作成される.複数のLine
クラスデータにID
を情報を付与してまとめたのがLines
クラスである.Lines
クラスの集合にbbox
とproj4string
を付与したのがSpatialLines
クラスである.SpatialLines
に属性のデータフレームを追加したのがSpatialLinesDataFrame
クラスである.
# 経由地点データ
L1 <- matrix(c(135.76,35.1,135.79,35.11,135.86,35.12,135.94,35.02), ncol=2, byrow=TRUE)
L2 <- matrix(c(135.86,35.12,135.85,35.11,135.86,35.1,135.87,35.07), ncol=2, byrow=TRUE)
L3 <- matrix(c(135.82,35.15,135.86,34.96,135.78,35,135.81,35.02), ncol=2, byrow=TRUE)
# Lineクラスへ変換
L1.l <- Line(L1); L2.l <- Line(L2); L3.l <- Line(L3);
# LinesクラスでまとめてID付与
L1.ls <- Lines(list(L1.l,L2.l),ID="1")
L3.ls <- Lines(list(L3.l),ID="3")
# SpatialLinesの作成
pj <- CRS("+proj=longlat +datum=WGS84") # 投影?座標系情報
sl <- SpatialLines(list(L1.ls,L3.ls),proj4string=pj)
# 属性データの追加(SpatialLinesのID = 属性データフレームの行名)
d <- data.frame(width=factor(c(5,10)), row.names=c(1,3))
sld <- SpatialLinesDataFrame(sl,data=d)
sld@lines # 線分データ
## [[1]]
## An object of class "Lines"
## Slot "Lines":
## [[1]]
## An object of class "Line"
## Slot "coords":
## [,1] [,2]
## [1,] 135.8 35.10
## [2,] 135.8 35.11
## [3,] 135.9 35.12
## [4,] 135.9 35.02
##
##
## [[2]]
## An object of class "Line"
## Slot "coords":
## [,1] [,2]
## [1,] 135.9 35.12
## [2,] 135.8 35.11
## [3,] 135.9 35.10
## [4,] 135.9 35.07
##
##
##
## Slot "ID":
## [1] "1"
##
##
## [[2]]
## An object of class "Lines"
## Slot "Lines":
## [[1]]
## An object of class "Line"
## Slot "coords":
## [,1] [,2]
## [1,] 135.8 35.15
## [2,] 135.9 34.96
## [3,] 135.8 35.00
## [4,] 135.8 35.02
##
##
##
## Slot "ID":
## [1] "3"
spplot(sld,zcol="width")
始点と終点が同じ点である点データからなる多角形はPloygon()
でPolygon
クラスが定義される.湖や沼のような穴である場合はhole=TRUE
としてホール属性を付与する必要がある.複数のPloygon
クラスデータにID
を情報を付与してまとめたのがPolygons
クラスである.Polygons
クラスの集合にbbox
とproj4string
を付与したのがSpatialPolygons
クラスである.SpatialPolygons
に属性のデータフレームを追加したのがSpatialPolygonsDataFrame
クラスである.
# 頂点データ
p1 <- matrix(c(1,2.4,1.7,3.1,2.4,2.4,1.7,1.7,1,2.4), byrow=TRUE, ncol=2)
p2 <- matrix(c(0.8,2,1,2,0.9,1.5,0.8,2), byrow=TRUE, ncol=2)
p3 <- matrix(c(-0.2,1.7,1,2.4,1.7,1.7,1,1,-0.2,1.7), byrow=TRUE, ncol=2)
p4 <- matrix(c(1,-0.3,2,-0.3,2,1,1.7,1.7,1,1,1,-0.3), byrow=TRUE, ncol=2)
# Polygonクラスへ変換
P1 <- Polygon(p1)
P2 <- Polygon(p2, hole=TRUE)
P3 <- Polygon(p3)
P4 <- Polygon(p4)
# PolygonsクラスでまとめてID付与
P1s <- Polygons(list(P1), ID="1")
P2s <- Polygons(list(P2, P3), ID="3")
P3s <- Polygons(list(P4), ID="4")
# SpatialPolygonsの作成
sp <- SpatialPolygons(list(P1s, P2s, P3s))
# 属性データ追加
d <- data.frame(name=c("A","B","C"), row.names=c(1,3,4))
spd <- SpatialPolygonsDataFrame(sp, data=d)
spd@polygons # ポリゴンデータ
## [[1]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 1.7 2.4
##
## Slot "area":
## [1] 0.98
##
## Slot "hole":
## [1] FALSE
##
## Slot "ringDir":
## [1] 1
##
## Slot "coords":
## [,1] [,2]
## [1,] 1.0 2.4
## [2,] 1.7 3.1
## [3,] 2.4 2.4
## [4,] 1.7 1.7
## [5,] 1.0 2.4
##
##
##
## Slot "plotOrder":
## [1] 1
##
## Slot "labpt":
## [1] 1.7 2.4
##
## Slot "ID":
## [1] "1"
##
## Slot "area":
## [1] 0.98
##
##
## [[2]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 0.900 1.833
##
## Slot "area":
## [1] 0.05
##
## Slot "hole":
## [1] TRUE
##
## Slot "ringDir":
## [1] -1
##
## Slot "coords":
## [,1] [,2]
## [1,] 0.8 2.0
## [2,] 0.9 1.5
## [3,] 1.0 2.0
## [4,] 0.8 2.0
##
##
## [[2]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 0.8333 1.7000
##
## Slot "area":
## [1] 1.33
##
## Slot "hole":
## [1] FALSE
##
## Slot "ringDir":
## [1] 1
##
## Slot "coords":
## [,1] [,2]
## [1,] -0.2 1.7
## [2,] 1.0 2.4
## [3,] 1.7 1.7
## [4,] 1.0 1.0
## [5,] -0.2 1.7
##
##
##
## Slot "plotOrder":
## [1] 2 1
##
## Slot "labpt":
## [1] 0.8333 1.7000
##
## Slot "ID":
## [1] "3"
##
## Slot "area":
## [1] 1.33
##
##
## [[3]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 1.5141 0.5374
##
## Slot "area":
## [1] 1.65
##
## Slot "hole":
## [1] FALSE
##
## Slot "ringDir":
## [1] 1
##
## Slot "coords":
## [,1] [,2]
## [1,] 1.0 -0.3
## [2,] 1.0 1.0
## [3,] 1.7 1.7
## [4,] 2.0 1.0
## [5,] 2.0 -0.3
## [6,] 1.0 -0.3
##
##
##
## Slot "plotOrder":
## [1] 1
##
## Slot "labpt":
## [1] 1.5141 0.5374
##
## Slot "ID":
## [1] "4"
##
## Slot "area":
## [1] 1.65
spplot(spd,zcol="name")
SpatialPolygons
やSpatialPolygonsDataFrame
のポリゴンを任意のグループのポリゴンに分解するには
spd1 <- spd[1:2,]
spd2 <- spd[3,]
par(mfrow=c(1,2))
plot(spd1)
plot(spd2)
ポリゴンを結合するには,maptools
パッケージのunionSpatialPolygons()
を用いて, 結合したいポリゴンのID
を同じにする.
library(maptools)
spd3 <- unionSpatialPolygons(spd,IDs=c(1,1,1))
plot(spd3)
同じ属性を含む場合に異なるSpatialPolygonsDataFrame
のポリゴンを結合する場合は,spRbind()
を用いる.
spd4 <- spRbind(spd1,spd2)
plot(spd4)